package com.bestcem.xm.member.dao.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.bestcem.xm.member.entity.mysql.MemberProjectEntity;
import com.bestcem.xm.member.service.dto.ProjectMemberDto;
import com.bestcem.xm.member.service.param.ProjectManagerDynamicSql;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;

/**
 * @author dc.wang <dc.wang@idiaoyan.com>
 * @version V1.0
 * @date 2021/9/18 13:40
 */
@Mapper
public interface MemberProjectMapper extends BaseMapper<MemberProjectEntity> {

    /**
     * 查询具有相同名称或编号的项目
     *
     * @param orgId       企业id
     * @param projectName 项目名称
     * @param projectCode 项目编号
     * @return true 存在
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    MemberProjectEntity findByNameOrCode(@Param("orgId") String orgId, @Param("name") String projectName, @Param("code") String projectCode);

    /**
     * 根据项目id查询联系人项目信息
     *
     * @param id 项目id
     * @return com.bestcem.xm.member.entity.mysql.ProjectEntity
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/10/11 14:33
     */
    MemberProjectEntity selectByProjectId(@Param("projectId") String id);

    /**
     * 根据项目id列表和企业标识查询项目列表
     *
     * @param orgId 企业标识
     * @param ids   项目id集合
     * @return java.util.List<com.bestcem.xm.member.entity.pojo.ProjectDo>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/10/11 14:42
     */
    List<MemberProjectEntity> selectByProjectIdsAndOrgId(@Param("projectIds") Collection<String> ids, @Param("orgId") String orgId);

    /**
     * 根据项目信息查询项目信息
     *
     * @param memberProjectEntity 项目信息
     * @return java.util.List<com.bestcem.xm.member.entity.mysql.ProjectEntity>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/10/11 14:50
     */
    List<MemberProjectEntity> selectByProjectEntity(MemberProjectEntity memberProjectEntity);


    /**
     * 查询联系人项目数
     *
     * @param orgId    企业标识
     * @param memberId 联系人标识
     * @return 项目数量
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    Integer countByMemberId(@NotNull @Param("orgId") String orgId, @NotNull @Param("memberId") String memberId);

    /**
     * 分页查询联系人项目
     *
     * @param orgId    企业id
     * @param memberId 联系人id
     * @param offset   偏移量
     * @param size     大小
     * @return 如果不存在，返回EmptyList
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    @NotNull
    List<MemberProjectEntity> listByMemberId(@NotNull @Param("orgId") String orgId, @NotNull @Param("memberId") String memberId,
                                   @NotNull @Param("offset") Integer offset, @NotNull @Param("size") Integer size);

    /**
     * 插入联系人项目信息
     *
     * @param convertDoToEntity 项目信息
     * @return int
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/10/11 15:10
     */
    int insertProject(MemberProjectEntity convertDoToEntity);

    /**
     * 批量插入数据
     * @param projectEntities 批量项目
     * @return
     */
    int batchInsert(List<MemberProjectEntity> projectEntities);

    /**
     * 更新项目信息
     * 注：覆盖所有列
     *
     * @param project 项目信息
     * @return int 更新的条数
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/10/11 15:21
     */
    int updateProjectById(MemberProjectEntity project);

    /**
     * 更新所有满足条件的项目的扩展字段名
     * 注:因为相同扩展字段id可能有不同的值
     * @param orgId 企业标识
     * @param fieldId 扩展字段id
     * @param value 扩展字段值
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/10/14
     */
    //int batchUpdateExtendFieldName(@Param("orgId") String orgId,
    //                                @Param("fieldId")  String fieldId,
    //                                @Param("value")  String value);

    /**
     * 更新所有满足条件的项目的扩展字段值
     * @param orgId 企业标识
     * @param fieldId 扩展字段id
     * @param oldValue 旧扩展字段值
     * @param newValue 新扩展字段值
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/10/14
     */
    //int batchUpdateExtendFieldValue(@Param("orgId") String orgId,
    //                           @Param("fieldId")  String fieldId,
    //                           @Param("oldValue")  Object oldValue,
    //                           @Param("newValue")  Object newValue);

    /**
     * 删除id集合中包含的项目
     *
     * @param orgId 企业id
     * @param ids   项目id集合
     * @return 删除数量
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/9/16
     */
    Integer batchDeleteByIds(@NotNull @Param("orgId") String orgId, @NotEmpty @Param("ids") List<String> ids);

    /**
     * 根据orgId删除项目信息
     *
     * @param orgId 组织标识
     * @return int
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/10/11 15:29
     */
    int deleteByOrgId(@Param("orgId") String orgId);

    /**
     * 删除所有满足条件的项目的扩展字段信息
     * 注:因为相同扩展字段id可能有不同的值
     * @param orgId 企业标识
     * @param fieldId 扩展字段id
     * @author dc.wang <dc.wang@idiaoyan.com>
     * @date 2021/10/14
     */
    //int batchDeleteExtendField(String orgId, String fieldId);

    List<MemberProjectEntity> findExtendExistsMember(@Param("orgId") String orgId);

    void updateMemberByField(@Param("memberList") List<MemberProjectEntity> memberList);
    /**
     * 条件sql查询项目经理
     * @param dynamicSql
     * @return
     */
    Integer countJoinMemberByCondition(@Param("query") ProjectManagerDynamicSql dynamicSql,
                                       @Param(Constants.WRAPPER) Wrapper<MemberProjectEntity> wrapper);

    List<ProjectMemberDto> listJoinMemberByCondition(@Param("query") ProjectManagerDynamicSql dynamicSql,
                                                     @Param(Constants.WRAPPER) Wrapper<MemberProjectEntity> wrapper);

    /**
     * 根据orgId memberId projectName 获取数据
     *
     * @param orgId
     * @param mid
     * @param projectName
     * @return
     */
    MemberProjectEntity findOneByOrgIdAndMemberIdAndName(@Param("orgId") String orgId,
                                                         @Param("mid") String mid,
                                                         @Param("projectName") String projectName);

    /**
     * 根据联系人列表删除项目
     *
     * @param orgId
     * @param memberIds
     */
    void deleteByMemberIds(@Param("orgId") String orgId, @Param("ids") List<String> memberIds);

    /**
     * 统计数量
     *
     * @param orgId
     * @param memberId
     * @param projectName
     * @param projectCode
     * @return
     */
    Integer countByOrgIdAndMemberIdAndProjectNameAndProjectCode(@Param("orgId") String orgId,
                                                                @Param("memberId") String memberId,
                                                                @Param("projectName") String projectName,
                                                                @Param("projectCode") String projectCode);

    /**
     * 根据公司id查询项目
     *
     * @param orgId 公司id
     * @return 项目列表
     * @author ympan <yuming.pan@idiaoyan.com>
     * @date 15:19 2022/3/28
     */
    List<MemberProjectEntity> listByOrgId(String orgId);
}
